1、两数之和，一个数组中找出2个数等于target的2个数下标
思想：2个for循环即可，第一个记录每个下标，第二个for用来计算记录的下标与第二个for计算求得的值
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> v;
        if(nums.empty())
            return v;
        int i=0;
        int j=1;
        while(i<nums.size())
        {
            j=i+1;
            while(j<nums.size()&&nums[i]+nums[j]!=target)
            {
                j++;
            }
            if(j<nums.size()&&nums[i]+nums[j]==target)
            {
                v.push_back(i);
                v.push_back(j);
            }
            i++;
        }
        return v;
    }
};

2、构建乘积数组，将b数组中的元素 都变为a数组中所有元素的乘积，除了该下标的元素
思想：利用2个for，第一个for用来记录a中下标对应的左半边元素乘积，第二个for用来将下标对应的右半边的元素乘积
class Solution {
public:
    vector<int> constructArr(vector<int>& a) {
        vector<int> v;
        
        //先将i左边的乘积放到v数组中
        for(int i=0, num=1;i<a.size();i++)
        {
            v.push_back(num);
            num=num*a[i];
        }
        //再将i右边的乘积放到数组中
        for(int i=a.size()-1,num=1;i>=0;i--)
        {
            v[i]*=num;
            num=num*a[i];
        }
        return v;
    }
};

3、将二叉搜索树变为有序的双向循环链表
思想：因为二叉搜索树的中序遍历是有序的，所以需要中序遍历二叉树，然后找出最左边节点，记为head，然后根据二叉树的中序遍历逆推，将后面节点都链接起来
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;

    Node() {}

    Node(int _val) {
        val = _val;
        left = NULL;
        right = NULL;
    }

    Node(int _val, Node* _left, Node* _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {
public:
    void _treeToDoublyList(Node* root,Node* &head,Node* &pre)
    {
        if(root==nullptr)
            return ;
        _treeToDoublyList(root->left,head,pre);
        if(pre==nullptr)
        {
            head=root;
            pre=head;
        }
        else
        {
            pre->right=root;
            root->left=pre;
            pre=root;
        }
        _treeToDoublyList(root->right,head,pre);

    } 
    Node* treeToDoublyList(Node* root) {
        if(root==nullptr)
            return nullptr;
        Node* head=nullptr;
        Node* pre=nullptr;
        _treeToDoublyList(root,head,pre);

        head->left=pre;
        pre->right=head;
        return head;
    }
};
